package com.wxy.config;

import com.wxy.domain.MyException;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;

import java.util.Map;

/**
 * @author 47868
 */
@SuppressWarnings("NullableProblems")
public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=utf-8");
        /*问题：发生在配置拦截器时，指定了不用拦截的路径但是访问时拦截器还是拦截了
         *原因：在输入访问路径后，浏览器通常会自动访问favicon.ico文件来获取网站的一个标识，后才会访问输入的路径，
         *导致访问favicon.ico文件时被拦截器拦截，阻止了下一步的访问。
         *解决方法：
         *1.在拦截器中使用request.getRequestURI()用来获取访问路径，与favicon.ico对比，相同放行。
         *2.在配置拦截器时，将/favicon.ico路径设为不用拦截。
         *3.在配置文件中配置拒绝浏览器访问favicon.ico文件★★★
         */
        //1.获取cookie
        Cookie[] cookies=request.getCookies();
        if(cookies==null) {
            System.out.println(request.getRequestURI());
            throw new MyException("cookie为空,请登录...");
        }
        String tokenString=null;
//		//2.得到名为token的cookie的值
        for (Cookie cookie : cookies) {
            if("token".equals(cookie.getName())) {
                tokenString=cookie.getValue();
            }
        }
        if(tokenString==null) {
            throw new MyException("token为空,请登录...");
        }
        //3.调用jwt判断token是否有效
        Map<String,Object> bodyMap=jwtConfig.checkToken(tokenString);
        //4.有效，存入request中
        if(bodyMap==null) {
            throw new MyException("伪造token!!!");
        }
        request.setAttribute("body", bodyMap);
        return true;
    }
}
